home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Interactive Reference Guide
/
C-C++ Interactive Reference Guide.iso
/
c_ref
/
csource3
/
113_01
/
a68tbls.asm
< prev
next >
Wrap
Assembly Source File
|
1985-03-11
|
13KB
|
571 lines
TITLE 'MACHINE LANGUAGE FUNCTIONS FOR 6800/6801 CROSS-ASSEMBLER V2.5'
PAGE 60
;
; 6800 CROSS-ASSEMBLER V. 2.5
;
; MAY, 1980
;
; JULY, 1980 -- REV. 2.2 CONSISTING OF FIXING THE M ERRORS THAT
; COME FROM FORWARD REFERENCES IN FDB AND FCB PSEUDO-OPS.
;
; OCTOBER, 1980 -- REV. 2.3 CONSISTING OF UPDATING THE ASSEMBLY
; LANGUAGE FILE AND I/O ROUTINES TO MATCH AND TAKE
; ADVANTAGE OF BDS C V1.4.
;
; OCTOBER, 1983 -- REV. 2.4 CONSISTING OF ADDING THE CPU PSEUDO-OP,
; ADDING THE 6801 CPU'S EXTRA OPCODES, AND SPEEDING UP THE
; CODE A BIT.
;
; SEPTEMBER, 1984 -- REV. 2.5 CONSISTING OF FIXING BUGS WITH THE SYMBOL
; TABLE SORT, THE WRITING OF FILES TO SPECIFIED DRIVES, AND THE
; HANDLING OF BLANK INPUT LINES.
;
; COPYRIGHT (C) 1980,83,84 WILLIAM C. COLLEY, III.
;
;FILE: A68TBLS.ASM
;
;MACHINE LANGUAGE FUNCTIONS.
;
MACLIB CMAC
;
; THE DIRECTORY TO THE FUNCTIONS IN THIS CRL FILE:
;
DIRECT
DEFINE GETOPC ;FIRST ENTRY.
DEFINE NUMOPCS ;SECOND ENTRY.
DEFINE GETATTR ;THIRD ENTRY.
DEFINE GETOPR ;FOURTH ENTRY.
DEFINE NUMOPRS ;FIFTH ENTRY.
ENDDIR
;
;ARGUEMENTS ARE PASSED THROUGH OFFSETS FROM THE STACK POINTER.
;THEY ARE DEFINED AS FOLLOWS:
;
ARG0 EQU 2 ;FIRST ARGUEMENT.
ARG1 EQU 4 ;SECOND ARGUEMENT.
ARG2 EQU 6 ;THIRD ARGUEMENT.
ARG3 EQU 8 ;FOURTH ARGUEMENT.
;
PAGE
;
;THIS FUNCTION GETS OPCODE NUMBER NUM FROM THE OPCODE TABLE. THE FUNCTION
;RETURNS 0 IF THE OPCODE WAS NOT FOUND, 1 IF IT WAS.
;
;FUNCTION IS CALLED AS FOLLOWS:
;
; GETOPC(NUM,OPCODE,VALUE,ATTRIB);
;
; NUM CHARACTER CONTAINING THE NUMBER OF THE DESIRED ENTRY.
; 0 REPRESENTS THE FIRST ENTRY IN THE TABLE. THE
; TABLE IS IN ALPHABETICAL ORDER FOR THE BENEFIT
; OF THE BINARY SEARCHING ROUTINE (WRITTEN IN C).
; OPCODE POINTER TO A 5-CHARACTER ARRAY WHICH WILL RECEIVE THE
; OPCODE'S NAME (NULL TERMINATED).
; VALUE POINTER TO A CHARACTER THAT WILL RECEIVE THE OPCODE'S
; VALUE.
; ATTRIB POINTER TO A CHARACTER THAT WILL RECEIVE THE OPCODE'S
; ATTIBUTE BYTE.
;
NUM EQU ARG0
OPCODE EQU ARG1
VALUE EQU ARG2
ATTRIB EQU ARG3
;
PRELUDE GETOPC
;
LXI H, NUM ;GET ENTRY NUMBER IN TABLE.
DAD SP
MOV A,M
CPI OPTBLL ;ENTRY IN TABLE?
LXI H, 0 ;IF NOT, RETURN 0.
RNC
;
MOV L,A ;FIND ENTRY BY COMPUTING
DAD H ;(6 * NUM) + TABLE BASE.
MOV E,L
MOV D,H
DAD H
DAD D
RELOC <LXI D,>,OPCTBL
DAD D
MOV E,L
MOV D,H
;
LXI H, OPCODE ;FIND OPCODE RETURN AREA.
DAD SP
MOV A,M
INX H
MOV H,M
MOV L,A
;
PUSH B ;MOVE OPCODE OUT TO RETURN AREA.
MVI C, 4
MOVOPC: LDAX D
INX D
MOV M,A
INX H
DCR C
RELOC JNZ,MOVOPC
POP B
;
MVI M, 0 ;TERMINATE OPCODE.
;
LXI H, ATTRIB ;FIND ATTRIBUTE RETURN AREA.
DAD SP
MOV A,M
INX H
MOV H,M
MOV L,A
;
LDAX D ;MOVE ATTRIBUTE TO RETURN AREA.
INX D
MOV M,A
;
LXI H, VALUE ;FIND VALUE RETURN AREA.
DAD SP
MOV A,M
INX H
MOV H,M
MOV L,A
;
LDAX D ;MOVE VALUE TO RETURN AREA.
MOV M,A
;
LXI H, 1 ;RETURN 1 FOR SUCCESSFUL GET.
RET
;
;THE OPCODE TABLE ITSELF:
;
; EACH ENTRY HAS A FOUR-BYTE NAME, A ONE-BYTE ATTRIBUTE,
; AND A ONE-BYTE VALUE. THE VALUE IS THE LOWEST
; NUMBERED OPCODE HAVING THAT NAME.
;
; THE ATTRIBUTE BYTE BITS ARE ALLOCATED AS FOLLOWS:
;
; 7 = PSEUDO-OP.
; 6 = IF NOT PSEUDO-OP, DIRECT ADDRESSING ALLOWED.
; IF PSEUDO-OP, IF GROUP (NO LABEL ALLOWED).
; 5 = RELATIVE ADDRESSING.
; 4 = REGISTER (A,B) MUST BE SPECIFIED.
; 3 = 16-BIT IMMEDIATE ADDRESSING ALLOWED.
; 2 = 8-BIT IMMEDIATE ADDRESSING ALLOWED.
; 1 = INDEXED OR EXTENDED ADDRESSING ALLOWED.
; 0 = REGISTER (A,B) MAY BE SPECIFIED.
;
; BITS 4 AND 0 WILL NEVER OCCUR TOGETHER BECAUSE THE REGISTER (A,B)
; SPECIFICATION IS EITHER FORBIDDEN, OPTIONAL, OR REQUIRED. BOTH BITS
; SET IS USED TO INDICATE AN OPCODE THAT IS ONLY VALID FOR THE 6801
; CPU. WHEN THE LINE ASSEMBLY ROUTINE FINDS BOTH BITS SET, IT CHECKS
; WHETHER OR NOT 6801 OPCODES ARE ENABLED, THEN CLEARS BOTH BITS. IN
; ADDITION, IF THE 6801 OPCODES ARE ENABLED, THE LINE ASSEMBLY ROUTINE
; CONVERTS THE ATTRIBUTE BYTE OF THE JSR OPCODE FROM 02H TO 42H.
;
OPCTBL: DB 'ABA', 0, 0, 1BH
DB 'ABX', 0, 11H, 3AH
DB 'ADC', 0, 56H, 89H
DB 'ADCA', 46H, 89H
DB 'ADCB', 46H, 0C9H
DB 'ADD', 0, 56H, 8BH
DB 'ADDA', 46H, 8BH
DB 'ADDB', 46H, 0CBH
DB 'ADDD', 5BH, 0C3H
DB 'AND', 0, 56H, 84H
DB 'ANDA', 46H, 84H
DB 'ANDB', 46H, 0C4H
DB 'ASL', 0, 03H, 48H
DB 'ASLA', 0, 48H
DB 'ASLB', 0, 58H
DB 'ASLD', 11H, 05H
DB 'ASR', 0, 03H, 47H
DB 'ASRA', 0, 47H
DB 'ASRB', 0, 57H
DB 'BCC', 0, 20H, 24H
DB 'BCS', 0, 20H, 25H
DB 'BEQ', 0, 20H, 27H
DB 'BGE', 0, 20H, 2CH
DB 'BGT', 0, 20H, 2EH
DB 'BHI', 0, 20H, 22H
DB 'BHS', 0, 20H, 24H
DB 'BIT', 0, 56H, 85H
DB 'BITA', 46H, 85H
DB 'BITB', 46H, 0C5H
DB 'BLE', 0, 20H, 2FH
DB 'BLO', 0, 20H, 25H
DB 'BLS', 0, 20H, 23H
DB 'BLT', 0, 20H, 2DH
DB 'BMI', 0, 20H, 2BH
DB 'BNE', 0, 20H, 26H
DB 'BPL', 0, 20H, 2AH
DB 'BRA', 0, 20H, 20H
DB 'BRN', 0, 31H, 21H
DB 'BSR', 0, 20H, 8DH
DB 'BVC', 0, 20H, 28H
DB 'BVS', 0, 20H, 29H
DB 'CBA', 0, 0, 11H
DB 'CLC', 0, 0, 0CH
DB 'CLI', 0, 0, 0EH
DB 'CLR', 0, 03H, 4FH
DB 'CLRA', 0, 4FH
DB 'CLRB', 0, 5FH
DB 'CLV', 0, 0, 0AH
DB 'CMP', 0, 56H, 81H
DB 'CMPA', 46H, 81H
DB 'CMPB', 46H, 0C1H
DB 'COM', 0, 03H, 43H
DB 'COMA', 0, 43H
DB 'COMB', 0, 53H
DB 'CPU', 0, 80H, 0BH
DB 'CPX', 0, 4AH, 8CH
DB 'DAA', 0, 0, 19H
DB 'DEC', 0, 03H, 4AH
DB 'DECA', 0, 4AH
DB 'DECB', 0, 5AH
DB 'DES', 0, 0, 34H
DB 'DEX', 0, 0, 09H
DB 'ELSE', 0C0H, 07H
DB 'END', 0, 80H, 06H
DB 'ENDI', 0C0H, 08H
DB 'EOR', 0, 56H, 88H
DB 'EORA', 46H, 88H
DB 'EORB', 46H, 0C8H
DB 'EQU', 0, 80H, 01H
DB 'FCB', 0, 80H, 02H
DB 'FCC', 0, 80H, 04H
DB 'FDB', 0, 80H, 03H
DB 'IF', 0, 0, 0C0H, 09H
DB 'INC', 0, 03H, 4CH
DB 'INCA', 0, 4CH
DB 'INCB', 0, 5CH
DB 'INS', 0, 0, 31H
DB 'INX', 0, 0, 08H
DB 'JMP', 0, 02H, 4EH
DB 'JSR', 0, 02H, 8DH
DB 'LDA', 0, 56H, 86H
DB 'LDAA', 46H, 86H
DB 'LDAB', 46H, 0C6H
DB 'LDD', 0, 5BH, 0CCH
DB 'LDS', 0, 4AH, 8EH
DB 'LDX', 0, 4AH, 0CEH
DB 'LSL', 0, 03H, 48H
DB 'LSLA', 0, 48H
DB 'LSLB', 0, 58H
DB 'LSLD', 11H, 05H
DB 'LSR', 0, 03H, 44H
DB 'LSRA', 0, 44H
DB 'LSRB', 0, 54H
DB 'LSRD', 11H, 04H
DB 'MUL', 0, 11H, 3DH
DB 'NEG', 0, 03H, 40H
DB 'NEGA', 0, 40H
DB 'NEGB', 0, 50H
DB 'NOP', 0, 0, 01H
DB 'ORA', 0, 56H, 8AH
DB 'ORAA', 46H, 8AH
DB 'ORAB', 46H, 0CAH
DB 'ORG', 0, 80H, 00H
DB 'PSH', 0, 10H, 36H
DB 'PSHA', 0, 36H
DB 'PSHB', 0, 37H
DB 'PSHX', 11H, 3CH
DB 'PUL', 0, 10H, 32H
DB 'PULA', 0, 32H
DB 'PULB', 0, 33H
DB 'PULX', 11H, 38H
DB 'RMB', 0, 80H, 05H
DB 'ROL', 0, 03H, 49H
DB 'ROLA', 0, 49H
DB 'ROLB', 0, 59H
DB 'ROR', 0, 03H, 46H
DB 'RORA', 0, 46H
DB 'RORB', 0, 56H
DB 'RTI', 0, 0, 3BH
DB 'RTS', 0, 0, 39H
DB 'SBA', 0, 0, 10H
DB 'SBC', 0, 56H, 82H
DB 'SBCA', 46H, 82H
DB 'SBCB', 46H, 0C2H
DB 'SEC', 0, 0, 0DH
DB 'SEI', 0, 0, 0FH
DB 'SET', 0, 80H, 0AH
DB 'SEV', 0, 0, 0BH
DB 'STA', 0, 52H, 87H
DB 'STAA', 42H, 87H
DB 'STAB', 42H, 0C7H
DB 'STD', 0, 53H, 0CDH
DB 'STS', 0, 42H, 08FH
DB 'STX', 0, 42H, 0CFH
DB 'SUB', 0, 56H, 80H
DB 'SUBA', 46H, 80H
DB 'SUBB', 46H, 0C0H
DB 'SUBD', 5BH, 83H
DB 'SWI', 0, 0, 3FH
DB 'TAB', 0, 0, 16H
DB 'TAP', 0, 0, 06H
DB 'TBA', 0, 0, 17H
DB 'TPA', 0, 0, 07H
DB 'TST', 0, 03H, 4DH
DB 'TSTA', 0, 4DH
DB 'TSTB', 0, 5DH
DB 'TSX', 0, 0, 30H
DB 'TXS', 0, 0, 35H
DB 'WAI', 0, 0, 3EH
;
OPTBLL EQU ($-OPCTBL)/6 ;CALCULATE LENGTH OF TABLE.
;
POSTLUDE GETOPC
;
PAGE
;
;THIS FUNCTION RETURNS THE NUMBER OF OPCODES IN THE OPCODE TABLE
;FOR THE BENEFIT OF THE BINARY SEARCHING ROUTINE (WRITTEN IN C).
;
;THIS FUNCTION IS CALLED AS FOLLOWS:
;
; NUMOPCS();
;
PRELUDE NUMOPCS
;
LXI H, OPTBLL ;RETURN NUMBER OF OPCODES.
RET
;
POSTLUDE NUMOPCS
;
PAGE
;
;THIS FUNCTION REMOVES THE PARITY BIT FROM ITS ARGUMENT AND LOOKS IT UP IN
;A TABLE. THE TABLE CLASSIFIES THE CHARACTER INTO ONE OF THE FOLLOWING BINS
;RETURNING THE APPROPRIATE CODE.
;
ALPHA EQU 0 ;ALPHABETIC.
NUMERC EQU 1 ;NUMERIC (0-9).
ENDLIN EQU 2 ;END OF LINE MARKERS (CR ;).
COMMA EQU 3 ;FIELD SEPARATORS (,).
OPERAT EQU 4 ;OPERATORS (* + / - > < = ( )).
BASDES EQU 5 ;BASE DESIGNATORS ($ @ %).
QUOTE EQU 6 ;STRING DELIMITERS (' ").
IMMED EQU 7 ;IMMEDIATE MODE DESIGNATOR (#).
BLANK EQU 10 ;WHITE SPACE CHARACTER (SPC TAB).
TRASH EQU 11 ;OTHER CONTROL CHARACTERS.
;
;THE FUNCTION IS CALLED AS FOLLOWS:
;
; GETATTR(BYTE);
;
; BYTE CHARACTER VALUE TO BE LOOKED UP.
;
BYTE EQU ARG0
;
PRELUDE GETATTR
;
LXI H, BYTE ;GET BYTE.
DAD SP
MOV A,M
ANI 7FH ;STRIP PARITY BIT.
;
RELOC <LXI H,>,ATTTBL ;INDEX INTO TABLE.
ADD L
MOV L,A
MVI A, 0
ADC H
MOV H,A
;
MOV L,M ;RETURN RESULT.
MVI H, 0
RET
;
;ATTRIBUTE TABLE ITSELF:
;
; FIRST A FILL MACRO TO SHORTEN THE SOURCE CODE:
;
BLOCK MACRO VALU,SIZE
REPT SIZE
DB VALU
ENDM
ENDM
;
ATTTBL: BLOCK TRASH,9 ; ^@ THRU ^H
DB BLANK ; TAB
DB ENDLIN ; LF
DB TRASH ; ^K
DB TRASH ; FF
DB TRASH ; CR
BLOCK TRASH,18 ; ALL OTHER CONTROL CHARACTERS
DB BLANK ; SPC
DB ALPHA ; EXCLAMATION POINT.
DB QUOTE ; "
DB IMMED ; #
DB BASDES ; $
DB BASDES ; %
DB ALPHA ; &
DB QUOTE ; '
DB OPERAT ; (
DB OPERAT ; )
DB OPERAT ; *
DB OPERAT ; +
DB COMMA ; ,
DB OPERAT ; -
DB ALPHA ; .
DB OPERAT ; /
BLOCK NUMERC,10 ; 0 THRU 9
DB ALPHA ; :
DB ENDLIN ; ;
DB OPERAT ; <
DB OPERAT ; =
DB OPERAT ; >
DB ALPHA ; ?
DB BASDES ; @
BLOCK ALPHA,26 ; A THRU Z
DB ALPHA ; [
DB ALPHA ; \
DB ALPHA ; ]
DB ALPHA ; ^
DB ALPHA ; _
DB ALPHA ; `
BLOCK ALPHA,26 ; SMALL A THRU SMALL Z
DB ALPHA ; {
DB ALPHA ; |
DB ALPHA ; }
DB ALPHA ; ~
DB TRASH ; RUB
;
POSTLUDE GETATTR
;
PAGE
;
;THIS FUNCTION GETS OPERATOR NUMBER NUM FROM THE OPERATOR TABLE. THE FUNCTION
;RETURNS 0 IF THE OPERATOR WAS NOT FOUND, 1 IF IT WAS.
;
;FUNCTION IS CALLED AS FOLLOWS:
;
; GETOPR(NUM,OPRATR,BS,TOKEN);
;
; NUM CHARACTER CONTAINING THE NUMBER OF THE DESIRED ENTRY.
; 0 REPRESENTS THE FIRST ENTRY IN THE TABLE. THE
; TABLE IS IN ALPHABETICAL ORDER FOR THE BENEFIT
; OF THE BINARY SEARCHING ROUTINE (WRITTEN IN C).
; OPRATR POINTER TO A 5-CHARACTER ARRAY WHICH WILL RECEIVE THE
; OPERATOR'S NAME (NULL TERMINATED).
; BS A DUD ARGUMENT TO MAINTAIN COMPATIBILITY WITH GETOPC.
; TOKEN A POINTER TO A CHARACTER THAT WILL RECEIVE THE OPERATOR'S
; TOKEN BYTE.
;
OPRATR EQU ARG1
TOKEN EQU ARG3
;
PRELUDE GETOPR
;
LXI H, NUM ;GET ENTRY NUMBER IN TABLE.
DAD SP
MOV A,M
CPI OPRTLL ;ENTRY IN TABLE?
LXI H, 0 ;IF NOT, RETURN 0.
RNC
;
MOV L,A ;FIND ENTRY BY COMPUTING
ADD A ;(5 * NUM) + TABLE BASE.
ADD A
ADD L
MOV L,A
RELOC <LXI D,>,OPRTBL
DAD D
MOV E,L
MOV D,H
;
LXI H, OPRATR ;FIND OPERATOR RETURN AREA.
DAD SP
MOV A,M
INX H
MOV H,M
MOV L,A
;
PUSH B ;MOVE OPERATOR TO RETURN AREA.
MVI C, 4
MOVOPR: LDAX D
INX D
MOV M,A
INX H
DCR C
RELOC JNZ,MOVOPR
POP B
;
ENDOPR: MVI M, 0 ;TERMINATE OPERATOR NAME.
;
LXI H, TOKEN ;FIND TOKEN RETURN AREA.
DAD SP
MOV A,M
INX H
MOV H,M
MOV L,A
;
LDAX D ;MOVE TOKEN TO RETURN AREA.
MOV M,A
;
LXI H, 1 ;RETURN 1 FOR SUCCESSFUL GET.
RET
;
;THE OPERATOR TABLE ITSELF:
;
; THE OPERATOR TOKENS ARE AS FOLLOWS:
;
GETKN EQU 1
NETKN EQU 2
LETKN EQU 3
ANDTKN EQU 4
ORTKN EQU 5
XORTKN EQU 6
NOTTKN EQU 7
MODTKN EQU 8
SHLTKN EQU 9
SHRTKN EQU 10
HITKN EQU 11
LOWTKN EQU 12
GTTKN EQU '>'
EQTKN EQU '='
LTTKN EQU '<'
;
OPRTBL: DB 'AND', 0, ANDTKN
DB 'EQ', 0, 0, EQTKN
DB 'GE', 0, 0, GETKN
DB 'GT', 0, 0, GTTKN
DB 'HIGH', HITKN
DB 'LE', 0, 0, LETKN
DB 'LOW', 0, LOWTKN
DB 'LT', 0, 0, LTTKN
DB 'MOD', 0, MODTKN
DB 'NE', 0, 0, NETKN
DB 'NOT', 0, NOTTKN
DB 'OR', 0, 0, ORTKN
DB 'SHL', 0, SHLTKN
DB 'SHR', 0, SHRTKN
DB 'XOR', 0, XORTKN
;
OPRTLL EQU ($-OPRTBL)/5 ;CALCULATE LENGTH OF TABLE.
;
POSTLUDE GETOPR
;
PAGE
;
;THIS FUNCTION RETURNS THE NUMBER OF OPERATORS IN THE OPERATOR TABLE
;FOR THE BENEFIT OF THE BINARY SEARCHING ROUTINE (WRITTEN IN C).
;
;THIS FUNCTION IS CALLED AS FOLLOWS:
;
; NUMOPRS();
;
PRELUDE NUMOPRS
;
LXI H, OPRTLL ;RETURN NUMBER OF OPCODES.
RET
;
POSTLUDE NUMOPRS
;
;END OF PACKAGE:
;
END
BLE ITSELF:
;
; THE OPERATOR TOKENS ARE AS FOLLOWS:
;
GETKN EQU 1
NETKN EQU 2
LETKN